home *** CD-ROM | disk | FTP | other *** search
- {
- JS> I'm looking for some sort of function to return that:
- JS> SOMEFILE.TXT = SOM*.TX?
-
- I've written that once. Sorry for the lack of comments.
-
- --------------
- { Unit with universal wildcard search function, Arne de Bruijn, 1994, PD }
- unit find4dos;
-
- interface
- function FindName(SearchStr,NameStr:string):boolean;
- implementation
- function FindName(SearchStr,NameStr:string):boolean; assembler;
- {
- Compare SearchStr with NameStr, and allow wildcards in SearchStr.
- The following wildcards are allowed:
- *ABC* matches everything which contains ABC
- [A-C]* matches everything that starts with either A,B or C
- [ADEF-JW-Z] matches A,D,E,F,G,H,I,J,W,V,X,Y or Z
- ABC? matches ABC, ABC1, ABC2, ABCA, ABCB etc.
- ABC[?] matches ABC1, ABC2, ABCA, ABCB etc. (but not ABC)
- ABC* matches everything starting with ABC
- (for using with DOS filenames like DOS (and 4DOS), you must split the
- filename in the extention and the filename, and compare them seperately)
- }
-
- var
- LastW:word;
- asm
- cld
- push ds
- lds si,SearchStr
- les di,NameStr
- xor ah,ah
- lodsb
- mov cx,ax
- mov al,es:[di]
- inc di
- mov bx,ax
- or cx,cx
- jnz @ChkChr
- or bx,bx
- jz @ChrAOk
- jmp @ChrNOk
- xor dh,dh
- @ChkChr:
- lodsb
- cmp al,'*'
- jne @ChkQues
- dec cx
- jz @ChrAOk
- mov dh,1
- mov LastW,cx
- jmp @ChkChr
- @ChkQues:
- cmp al,'?'
- jnz @NormChr
- inc di
- or bx,bx
- je @ChrOk
- dec bx
- jmp @ChrOk
- @NormChr:
- or bx,bx
- je @ChrNOk
- {From here to @No4DosChr is used for [0-9]/[?]/[!0-9] 4DOS wildcards...}
- cmp al,'['
- jne @No4DosChr
- cmp word ptr [si],']?'
- je @SkipRange
- mov ah,byte ptr es:[di]
- xor dl,dl
- cmp byte ptr [si],'!'
- jnz @ChkRange
- inc si
- dec cx
- jz @ChrNOk
- inc dx
- @ChkRange:
- lodsb
- dec cx
- jz @ChrNOk
- cmp al,']'
- je @NChrNOk
- cmp ah,al
- je @NChrOk
- cmp byte ptr [si],'-'
- jne @ChkRange
- inc si
- dec cx
- jz @ChrNOk
- cmp ah,al
- jae @ChkR2
- inc si {Throw a-Z < away}
- dec cx
- jz @ChrNOk
- jmp @ChkRange
- @ChkR2:
- lodsb
- dec cx
- jz @ChrNOk
- cmp ah,al
- ja @ChkRange {= jbe @NChrOk; jmp @ChkRange}
- @NChrOk:
- or dl,dl
- jnz @ChrNOk
- inc dx
- @NChrNOk:
- or dl,dl
- jz @ChrNOk
- @NNChrOk:
- cmp al,']'
- je @NNNChrOk
- @SkipRange:
- lodsb
- cmp al,']'
- loopne @SkipRange
- jne @ChrNOk
- @NNNChrOk:
- dec bx
- inc di
- jmp @ChrOk
- @No4DosChr:
- cmp es:[di],al
- jne @ChrNOk
- inc di
- dec bx
- @ChrOk:
- xor dh,dh
- dec cx
- jnz @ChkChr { Can't use loop, distance >128 bytes }
- or bx,bx
- jnz @ChrNOk
- @ChrAOk:
- mov al,1
- jmp @EndR
- @ChrNOk:
- or dh,dh
- jz @IChrNOk
- jcxz @IChrNOk
- or bx,bx
- jz @IChrNOk
- inc di
- dec bx
- jz @IChrNOk
- mov ax,[LastW]
- sub ax,cx
- add cx,ax
- sub si,ax
- dec si
- jmp @ChkChr
- @IChrNOk:
- mov al,0
- @EndR:
- pop ds
- end;
-
- end.